package stack;

/**
 * 递归
 * （1）每执行方法时，会在方法区空间生成一个栈，栈空间彼此独立。
 * （2）栈里存储的变量可能是共享的，如引用类型变量如数组，指向堆空间。如果是局部变量则是彼此独立的。
 * （3）递归必须向退出递归的条件逼近，否则便会无限递归，最终报栈溢出错误。
 * （4）当调用方法时遇到return或者方法执行完毕，就会返回，返回给方法调用处。以上步骤一直反复，直到执行完毕。
 *
 */
public class Recursion {
    /**
     * 斐波那契
     */
    public static int factorial(int n) {
        if (n == 1) {//递归退出条件
            return 1;
        } else {
            return factorial(n -1) * n;// * n 会根据出栈顺序拼接
        }
    }


//        fac(3-1) * 3
//        fac(2-1) * 2 * 3
//        fac(1)  * 2 * 3

}
